package com.demo.study.thread;


/***
 * join  保证线程的执行顺序
 *
 * join()方法的底层是利用wait()方法实现的。
 * 可以看出，join方法是一个同步方法，当主线程调用t1.join()方法时，
 * 主线程先获得了t1对象的锁，随后进入方法，调用了t1对象的wait()方法，
 * 使主线程进入了t1对象的等待池，此时，A线程则还在执行，
 * 并且随后的t2.start()还没被执行，因此，B线程也还没开始。
 * 等到A线程执行完毕之后，主线程继续执行，走到了t2.start()，
 * B线程才会开始执行。join()方法的底层是利用wait()方法实现的。
 * 可以看出，join方法是一个同步方法，当主线程调用t1.join()方法时，
 * 主线程先获得了t1对象的锁，随后进入方法，调用了t1对象的wait()方法，
 * 使主线程进入了t1对象的等待池，此时，A线程则还在执行，
 * 并且随后的t2.start()还没被执行，因此，B线程也还没开始。
 * 等到A线程执行完毕之后，主线程继续执行，走到了t2.start()，B线程才会开始执行。
 *
 *
 * 总结:join底层利用wait实现的，由之前的并行  变为串行，主线程先获取对象锁，调用wait方法进入等待
 * t1执行完后  在进行执行后边的线程
 */
public class TestJoin {
 
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		ThreadTest t1=new ThreadTest("A");
		ThreadTest t2=new ThreadTest("B");
		ThreadTest t3=new ThreadTest("C");

		t1.start();
		t1.join();
		t2.start();

		t3.start();

	}
 
 
}
class ThreadTest extends Thread {
	private String name;
	public ThreadTest(String name){
		this.name=name;
	}
	public void run(){
		for(int i=1;i<=5;i++){
				System.out.println(name+"-"+i);
		}		
	}
}
